Next: 3.14.4 Assembler Routine (reentrant) Up: 3.14 Interfacing with Assembler Previous: 3.14.2 Registers usage Contents Index

## 3.14.3 Assembler Routine (non-reentrant)

In the following example the function c_func calls an assembler routine asm_func, which takes two parameters.

> `extern int asm_func(unsigned char, unsigned char);`
> `int c_func (unsigned char i, unsigned char j)`
> `{`
> `return asm_func(i,j);`
> `}`
> `int main()`
> `{`
> `return c_func(10,9);`
> `}`

The corresponding assembler function is:

> `.globl _asm_func_PARM_2`
> `.globl _asm_func`
> `.area OSEG`
> `_asm_func_PARM_2:`
> `.ds 1`
> `.area CSEG`
> `_asm_func:`
> `mov a,dpl`
> `add a,_asm_func_PARM_2`
> `mov dpl,a`
> `mov dph,#0x00`
> `ret`

The parameter naming convention is _<function_name>_PARM_<n>, where n is the parameter number starting from 1, and counting from the left. The first parameter is passed in DPH, DPL, B and ACC according to the description above. The variable name for the second parameter will be _<function_name>_PARM_2.
Assemble the assembler routine with the following command:
sdas8051 -losg asmfunc.asm
Then compile and link the assembler routine to the C source file with the following command:
sdcc cfunc.c asmfunc.rel

Next: 3.14.4 Assembler Routine (reentrant) Up: 3.14 Interfacing with Assembler Previous: 3.14.2 Registers usage Contents Index